import {Direction, ColliderGroups} from './constants/Enums';
import Game from './Game';

const {ccclass, property} = cc._decorator;
/**
 * 子弹.
 * 只能垂直移动.
 */
@ccclass
export default class Bullet extends cc.Component {

    /**
     * 移动方向
     */
    up = false;
    /**
     * 移动方向
     */
    down = false;

    /**
     * 子弹垂直方向速度.
     */
    @property({type:cc.Integer})
    ySpeed = 0;

    /**
     * 游戏主对象.
     */
    game:Game;

    // LIFE-CYCLE CALLBACKS:
    
    // onLoad () {}

    // start () {}

    update (dt) {
        //根据当前移动方向每帧更新子弹位置.
        if(this.up){
            this.node.y += this.ySpeed * dt;
        }
        if(this.down){
            this.node.y -= this.ySpeed * dt;
        }

        //如果子弹一直存活到超出屏幕,则回收.
        // if(this.node.x > this.node.parent.width/2 + this.node.width/2){
        // }else if(this.node.x < - this.node.parent.width/2 - this.node.width/2){
        // }
        if(this.node.y > this.node.parent.height/2 + this.node.height/2){
            this.recycle();
        }else if(this.node.y < - this.node.parent.height/2 - this.node.height/2){
            this.recycle();
        }
    }

    // LIFE-CYCLE CALLBACKS END

    /**
     * 初始化子弹的位置和移动方向.
     */
    init(pos:cc.Vec2, direction:Direction){
        if(direction === Direction.UP){
            this.up = true;
        }
        if(direction === Direction.DOWN){
            this.down = true;
        }
        this.node.setPosition(pos.x,pos.y);
    }

    /**
     * 当碰撞产生的时候调用
     * @param  {cc.Collider} other 产生碰撞的另一个碰撞组件
     * @param  {cc.Collider} self  产生碰撞的自身的碰撞组件
     */
    onCollisionEnter(other:cc.Collider, self:cc.Collider) {
        this.recycle();
    }
    /**
     * 回收到对象池.
     */
    recycle(){
        this.game.pool.putBullet(this.node);
        this.node.active = false;//隐藏该节点及其所有子节点,禁用所有组件和上面的update.
    }
}
